home *** CD-ROM | disk | FTP | other *** search
/ Scene 96 / Scene 96 International Edition (Zyklop Software) (Disc 2) (1997).iso / misc / coding / gema26a / gema_fra.doc < prev    next >
Text File  |  1996-01-04  |  38KB  |  1,034 lines

  1.  
  2.                                      -(G)-(E)-(M)-(A)-
  3.                             [G]enPC [E]lite [M]acro [A]ssembler
  4.  
  5.                               (C)oderite SECTOR ONE 1994-95
  6.  
  7.                          Documentation francaise de la version 2.6
  8.  
  9.  
  10. I. Introduction
  11.     1. Shareware
  12.     2. Credits
  13.     3. Greetings
  14.  
  15. II. Generalites
  16.     1. Modes d'adressage
  17.     2. Arithmetique
  18.     3. Directives d'assemblage
  19.  
  20. III. Mnemoniques
  21.  
  22.  
  23. IV. Conclusion
  24.                                           --==--
  25.  
  26. I. Introduction
  27. _______________
  28.  
  29.  
  30.         GenPC alias GEMA est un nouvel assembleur symbolique pour MS-DOS. Il est
  31. tres largement inspire de la reference en matiere d'assembleur : GenST sur Atari. De
  32. plus les normes et mnemoniques Intel ont etees un peu adaptes a la norme Motorola 680x0
  33. qui est beaucoup plus simple et logique. Contrairement a TASM qui se donne un style
  34. pseudo-structure qu'on doit trainer comme un boulet, qui buggue a mort sur les
  35. instructions 386+, et qui ne nous laisse pas vraiment controler l'assemblage des
  36. mnemoniques, GEMA vous laisse libre de coder comme des porcs et doit bugger un peu
  37. moins. Il supporte desormais tous les opcodes des processeurs Intel, du 8086 au P6, y
  38. compris les opcodes non documentes !
  39.     De plus il est beaucoup plus rapide que TASM, ne necessite pas de linker, et
  40. possede des directives d'assemblages tres pratiques, en particulier le INCBIN qui a
  41. toujours fait atrocement defaut sur TASM et MASM.
  42.     Si vous ne codez pas encore en assembleur, GEMA est celui qu'il vous faut pour
  43. vous initier a la joie (heu...) des 80x86. De plus vous n'aurez aucun mal a passer au
  44. 680x0 par la suite.
  45.     Si vous codez deja en 680x0 vous n'aurez pas a vous prendre la tete pour
  46. ingurgiter les bizarreries d'Intel et ne serez pas degoutes que TASM soit aussi lourd a
  47. utiliser que les 80x86 sont complexes.
  48.     Si vous codez deja en 80x86, vous devez en avoir marre de TASM et MASM. GEMA
  49. est l'assembleur qu'il vous faut ! Il est particulierement adapte a la programmation en
  50. mode flat (V86) ou protege et est tres simple a utiliser en 32-bits contrairement aux
  51. assembleurs cites precedemment.
  52.     Un environnement avec un editeur sympa du style Borland C++ et la possibilite
  53. d'assembler et de debugguer directement en memoire, est en finition.
  54.  
  55.  
  56. I.1 Shareware
  57. _____________
  58.  
  59.  
  60.     GEMA est un SHAREWARE. L'installer sur votre disque dur implique de votre part
  61. l'acceptation des conditions suivantes :
  62.  
  63.     - Si vous travaillez au Centre de Facturation et de Recouvrement de France-
  64. Telecom a Savigny, vous devez faire sauter ma derniere facture, ainsi que les suivantes
  65. si possible,
  66.  
  67.         - Si vous aimez le COBOL vous devez vous tirer une balle,
  68.  
  69.     - Si vous etes surveillant a l'Epita, vous ne devez pas m'accuser a tort de
  70. gruger pendant les interros,
  71.  
  72.     - Si vous etes un coder, graphiste, zikos ou courrier solitaire, vous devez
  73. entrer dans Sector One,
  74.  
  75.         - Si vous etes une jeune fille d'une vingtaine d'annees, vous devez
  76. etre folle amoureuse de moi,
  77.  
  78.         - Si vous pouvez avoir du matos pas cher, vous devez m'en faire part,
  79.  
  80.     - Si vous trouvez des bugs vous devez aussi m'en faire part,
  81.  
  82.     - Si vous n'en trouvez pas c'est que vous ne l'avez jamais utilise, c'est mal,
  83.  
  84.     A propos, cette version n'est qu'une beta donc si il reste des bugs c'est normal
  85. mais n'hesitez pas a me les signaler en precisant bien ce que vous avez fait, ce qui
  86. aurait du se passer et ce que vous avez a la place, ainsi que la date de votre version de
  87. GEMA.
  88.     Les points suivants en particulier ne fonctionnent pas encore (c'est pas un bug
  89. c'est la flemme), mais ne sauraient tarder :
  90.  
  91.     - Instruction CMPXCHG que je n'ai jamais reussi a assembler avec TASM,
  92.  
  93.         - Macros : uniquement presentes dans les versions enregistrees :
  94.  
  95.         Si vous desirez vous enregistrer en tant qu'utilisateur legal de GEMA, envoyez
  96. la modique somme de 50 F a l'adresse figurant plus bas. Vous beneficierez alors des
  97. avantages suivants :
  98.  
  99.         - Vous aurez bonne conscience,
  100.  
  101.         - Vous encouragerez l'auteur a continuer de coder des sharewares,
  102.  
  103.         - Vous recevrez en avant-premiere les mises a jour par InterNet ou par courrier,
  104.  
  105.         - Votre nom ou pseudo sera cite dans les prochaines versions.
  106.  
  107.         Ca me ferait aussi tres plaisir de recevoir des programmes codes avec GEMA...
  108.  
  109. I.2 Credits
  110. ___________
  111.  
  112.  
  113.         Assembleur : Doc, code, gfx (Heu...), musique (Ou ca ?) ...... Jedi/Sector One
  114.         Support moral : .................................................... Stephanie
  115.         Correction des fautes d'orthographe de la doc francaise ................ Mogar
  116.         Softs utilises : Qedit, Gema, Hacker's View, DJGPP
  117.         Beta-testeurs : MJS, Altomcat/Sector One, ODC/Sector One,
  118.                         Createur/Eko, Oxygene, Keops/Equinox,
  119.                         Alexey Voinov
  120.  
  121.     Vous pouvez nous contacter a l'adresse suivante :
  122.  
  123.                 Frank DENIS
  124.         2, Rue Madeleine Laffite
  125.                 F-93100 MONTREUIL
  126.  
  127.     Ou sur RTEL, bal SECTOR ONE, JEDI/SECTOR ONE ou ODC,
  128.  
  129.         Ou par Email : j@nether.net
  130.         Vous pouvez recevoir la derniere version de l'assembleur par InterNet en
  131. envoyant un E-Mail avec le sujet GET GEMA a l'adresse precedente, ou par ftp sur
  132. ftp.nether.net dans le repertoire /pub/gema/* . Il est aussi disponible en
  133. telechargement gratuit sur ACE BBS au [+33] (1) 45 88 75 48 et par FidoNet avec le
  134. mot-cle GEMA sur la node 2:320/305. Vous pouvez aussi le telecharger par Minitel au
  135. prix d'un simple appel sur Paris sur RTC-One au (1) 48 70 10 29 ou (1) 48 58 46 17
  136. ( acces V34 possible au (1) 49 88 76 91 ) . GEMA doit trainer sur d'autres BBS et
  137. FTP mais c'est avec les moyens precedents que vous avez le plus de chances d'avoir
  138. la derniere version le plus rapidement possible.
  139.  
  140.         Mais par pitie ne me telephonez pas...
  141.  
  142.  
  143. I.3 Greetings
  144. _____________
  145.  
  146.  
  147.     Un gros bisou a : Infiny (LCA), Eclipse (Hacker Croll), CyberPunk (qui m'a tout
  148. appris d'Unix et du C), Gerald (merci pour les bouquins sur le C++), Trash, Dream
  149. Syndicate, Underground Tectonics (Sexo, Online, Clocky), Eko (Maxx, McDo, Createur),
  150. Eagles (Ard), Equinox (Checksum, Al Cool, Keops), Lego System (Skill),
  151. Dune (Meerclaw, Evil Metal, Chuck, Floopy...), Fantasy (Deneb, Remalon : Hep faut vous
  152. mettre a l'asm), Genesis (Lachez le TP), DBA (Bonus Software), Sentry (Eagle), Isiolis,
  153. Imphobia, Dead Hacker Society, Control Team, Quicky, Anixter, Fantasy, Live!,
  154. Fongus, Bresil, DSK, Alexey Voinov, Oxygene, Jared, Impact Studios, Kloon,
  155. Antares, Pulse, RealTech, Animal Mine, Oxyron, Max in the Star System,
  156. Epsilon, EMF, Plant, Cascada, Cubic Team, et a vous...
  157.  
  158.         Une liste plus complete est disponible dans la version anglaise de la doc.
  159.  
  160. II. Generalites
  161. _______________
  162.  
  163.  
  164.         GEMA necessite un 386, un 486, un Pentium ou un P6 (32 bits oblige). Il prend un
  165. ou deux parametres qui sont le nom du fichier source et eventuellement le nom du fichier
  166. executable.
  167.  
  168.         Genre : gema youpla.s
  169.            ou : gema youpla.s yahoga.exe
  170.  
  171.         Si il n'y a pas de second parametre, le fichier cree sera le nom du fichier
  172. source avec l'extension EXE ou COM.
  173.  
  174.         Quelques options peuvent preceder les noms de fichiers :
  175.  
  176.         -E ou --preprocess : affiche chaque ligne traitee
  177.         -v ou --verbose    : affichage etendu
  178.         -q ou --quiet      : affichage reduit
  179.         -o ou --optimize   : optimisations automatiques ( 3 passes necessaires )
  180.         -nw ou --nowarning : n'affiche plus les warnings
  181.         -a ou --autoalign  : alignement automatique ( experimental )
  182.         -86, -88, --cpu=86 ou --cpu=88,
  183.         -186 ou --cpu=186,
  184.         -286 ou --cpu=286,
  185.         -386 ou --cpu=386,
  186.         -486 ou --cpu=486,
  187.         -586, -pentium, --cpu=586 ou --cpu=pentium,
  188.         -686, -p6, --cpu=686 ou --cpu=p6 : assemble uniquement les opcodes
  189. reconnus par le type de processeur designe. Par default, toutes les instructions
  190. du 8086 au p6 sont reconnues.
  191.  
  192.  
  193. II.1 Modes d'adressage
  194. ______________________
  195.  
  196.  
  197.     Les modes d'adressage sont au format Motorola 680x0, a savoir :
  198.  
  199.     Designation        Intel            GEMA
  200.     ------------------------------------------------------------------
  201.     Immediat court        12            #12.b
  202.     Immediat (mot)        32000            #32000.w
  203.     Immediat (mot long)     99999            #99999.l
  204.  
  205.     .b, .w et .l sont facultatifs, il permettent en fait de forcer un
  206. type, par exemple pour faire reconnaitre une valeur qui se coderait sur un octet comme
  207. un mot long, indispensable pour le code automodifiant. Si on ne precise pas la taille,
  208. GEMA determine automatiquement la plus petite.
  209.  
  210.     Designation        Intel            GEMA
  211.     ------------------------------------------------------------------
  212.     Direct            Ah, Bx, Ecx, Si, Cs    Ah, Bx, Ce, Si, Cs
  213.  
  214.     Sous GEMA, les registres ont la meme designation que sous TASM en dehors des
  215. registres 32-bits qui sont de la forme : Ae, Be, Ce, De, Sie, Die, Bpe et Spe. C'est
  216. plus logique comme ca. MAIS dans la plupart des cas, les seules lettres A, B, C ou D
  217. suffisent. Car comme en 680x0, c'est dans l'instruction qu'on determine la taille des
  218. operandes et GEMA adapte les operandes automatiquement.
  219.  
  220.     Ainsi :    NEG.B A sous GEMA equivaut a NEG AL sous TASM
  221.  
  222. Par defaut une instruction .B sur un registre indetermine equivaut a AL,BL,CL ou DL. Si
  223. c'est AH, BH, CH ou DH, il faut evidemment mettre le registre complet,
  224.     Ex: NEG.B AH
  225.  
  226.         NEG.W A sous GEMA equivaut a NEG AX sous TASM
  227.  
  228.     Sauf pour les instructions qui ne prennent pas de mots comme operandes, la taille
  229. par defaut est le mot. Par consequent NEG.W A ou NEG A sont identiques. C'est valable
  230. pour la quasi-totalite des instructions.
  231.  
  232.         NEG.L A sous GEMA equivaut a NEG EAX sous TASM
  233.  
  234.     Dans tous les cas on peut bien entendu mettre le registre en entier a la place du
  235. registre indetermine. Par exemple NEG.L EAX marche impec. Par contre NEG.L AX va vous
  236. balancer une erreur car la taille du registre est incoherente avec la taille de
  237. l'instruction.
  238.  
  239.     Si vous trouvez que c'est plus complique de preciser la taille dans l'instruction
  240. que de la sous-entendre avec la taille des operandes, vous n'avez rien compris a la vie.
  241.     Car d'une part c'est plus clair comme ca, d'autre part vous n'avez pas a vous
  242. taper des WORD PTR et autres en cas d'ambiguite.
  243.  
  244.     Ainsi :    NEG.L (SI,DI) sous GEMA equivaut a NEG DWORD PTR [SI+DI] sous TASM
  245.  
  246.     Ah tiens j'allais oublier ... A la place de .b vous pouvez utiliser .s c'est
  247. pareil ... C'est juste histoire de rester dans les normes de GenST.
  248.  
  249.         Designation        Intel            GEMA
  250.     ------------------------------------------------------------------
  251.     Absolu court            [12]            12.b
  252.     Absolu (mot)            [32000]            32000.w
  253.     Absolu long            [99999]            99999.l
  254.  
  255.     La encore les .b .w et .l sont facultatifs, ils ne sont utiles que pour forcer
  256. un type. Autrement l'assembleur les determine tout seul comme un grand. Sous GEMA comme
  257. en 680x0, et etant donne que l'immediat est prefixe, une adresse absolue n'a pas de
  258. prefixe. C'est aussi valable pour les labels :
  259.  
  260.     NEG label sous GEMA equivaut a NEG WORD PTR [label] sous TASM.
  261.  
  262.         Designation        Intel            GEMA
  263.     ------------------------------------------------------------------
  264.     Indirect            [Si]            (Si)
  265.     Indirect avec registre        [Si+Bx]            (Si,Bx) ou (Si,B)
  266.  
  267.     La taille par defaut des registres d'index indetermines est un mot.
  268.  
  269.         Designation        Intel            GEMA
  270.     ------------------------------------------------------------------
  271.     Indirect avec reg et offset.b    [Si+Bx+12]        12.b(Si,Bx)
  272.     Indirect avec reg et offset.w    [Si+Bx+32000]        32000.w(Si,Bx)
  273.     Indirect avec reg et offset.l    [Esi+Ebx+99999]        99999.l(Sie, Be)
  274.  
  275.     Comme d'habitude les .b .w et .l sont pour le forcage uniquement.
  276.     Par exemple 12(Si,Bx) est strictement equivalent a 12.b(Si,Bx). C'est donc
  277. inutile de le preciser la plupart du temps, on peut balancer l'offset tel quel, GEMA se
  278. debrouillera.
  279.  
  280.         Designation        Intel            GEMA
  281.     ------------------------------------------------------------------
  282.     Indirect reg/off/facteur    [Esi+Ebx*facteur+off]    off(Sie,Be*facteur)
  283.  
  284.     Bon la je precise pas mais l'offset ca peut etre un .b un .w ou un .l comme au
  285. dessus ... Au passage le facteur ne marche qu'avec des registres 32-bits ainsi que les
  286. offsets longs ...
  287.  
  288.     L'ARGUMENT SOURCE EST TOUJOURS LE PREMIER, L'EVENTUEL ARGUMENT DESTINATION
  289. TOUJOURS APRES.
  290.  
  291.     Ainsi sous GEMA, pour mettre le contenu de AX dans BX il faut faire :
  292.  
  293.     MOVE A,B (ou MOV A,B) et non pas l'inverse comme dans TASM.
  294.  
  295.     Evidemment pour des instructions genre ENTER ou il n'y a pas d'argument source
  296. et destination, l'ordre est le meme que dans TASM. Pour toutes les autres c'est au
  297. format motorola soit l'inverse de TASM.
  298.  
  299. II.2. Arithmetique
  300.  
  301.     Tous les operateurs classique sont utilisables pour les offsets et immediats.
  302.     Par ordre de priorite decroissante (Ouaip ca gere meme les priorites) :
  303.  
  304.     []: Ce sont les parentheses ...
  305.         - : Oppose d'un nombre
  306.     < : Decalage gauche. Ex : 3<2 renvoit 12
  307.     > : Decalage droit. 6>1 renvoit 2
  308.     ^ : OU exclusif
  309.     & : ET logique
  310.     | : OU logique
  311.     / : Division
  312.     * : Multiplication
  313.     - : Soustraction (Ouaip il distingue les deux types de '-')
  314.     + : Addition
  315.     % : Modulo
  316.     = : Egalite : renvoit 0 si fausse et 1 si vraie.
  317.         @ : Divise par 16 ce qui suit. Par exemple @Toto donne l'offset de segment du
  318. Label Toto. Les @ sont accumulables, par ex @@Toto renvoit Toto divise par 256.
  319.         ~ : NON logique
  320.         \ : Retourne l'adresse de segment ce qui suit. La valeur sera forcement traitee
  321. comme un mot et sera relogee si le programme est un .EXE . C'est un peu l'equivalent du
  322. prefixe SEG sous MASM et TASM.
  323.         : : (Oui c'est le signe ':')
  324.             Versions < 2.5b : retourne les 4 bits de poids faibles de ce qui
  325. suit, un peu comme le prefixe OFFSET de MASM et TASM.
  326.             Versions >=2.5b : retourne ce qui suit modulo la taille de segment
  327. courante. Ceci a ete modifie par soucis de compatibilite avec A2G. Cet operateur n'a en
  328. pratique pas grand interet ...
  329.  
  330.     Exemple: 2+3*4/[-5-7]<[~3^5]
  331.  
  332.     En dehors des nombres on peut utiliser bien d'autres choses au sein d'operations
  333. arithmetiques :
  334.  
  335.     * : L'asterisque peut aussi representer l'adresse de l'instruction, ou tout au
  336. moins son offset par rapport au debut du programme.
  337.  
  338. {    Exemple :
  339.  
  340.         bra.s *    equivaut a :
  341.              toto jmp toto }
  342.  
  343.  
  344.         '': Code ASCII d'un ou de plusieurs caractere.
  345.  
  346. {    Exemple :
  347.                 'A' est equivalent a 65.
  348.                 'AB' est equivalent a $4142             }                                                         }
  349.  
  350.     Bases :
  351.  
  352.     Un nombre entre directement est toujours interprete en decimal.
  353.  
  354. {    Exemple :
  355.  
  356.         12 comme ca, c'est en base 10 pour GEMA.    }
  357.  
  358.     Pour l'hexa, il suffit de le faire preceder d'un $ (c'est moins debile qu'un
  359. 'h' a la fin avec quelque fois un 0 au debut pour eviter des confusions).
  360.  
  361. {    Exemple :
  362.  
  363.         Sous GEMA, $ABCD1234 est equivalent a 0ABCD1234h sous TASM.     }
  364.  
  365.     Un nombre binaire doit commencer par un %,
  366.  
  367. {    Exemple :
  368.  
  369.          %101 vaut 5.    }
  370.  
  371.     Un nombre octal doit commencer par un signe 'paragraphe' que je n'ai malheureu-
  372. sement pas sur mon clavier actuel. Bah de toutes facons ca sert a rien l'octal.
  373.  
  374.     On peut bien evidemment faire des operations melangeant plusieurs bases. Le
  375. forcage est possible sur toute expression,
  376.  
  377. {    Exemple :
  378.  
  379.         [1+$12A/%10001001].b  }
  380.  
  381.     Mais peut aussi etre fait sur un seul terme au sein de l'expression,
  382.  
  383. {    Exemple :
  384.  
  385.         $1234.b+1 vaut non pas $1235 mais $35 car le .b a reduit le terme $1234 a un
  386.         octet. }
  387.  
  388.     GEMA peut donc evaluer des operations tordues dans toutes les bases avec des
  389. forcages de types dans tous les sens, no problemo. Les resultats obtenus peuvent etre
  390. utilises n'importe ou en tant que constantes, offsets ou immediats. Mais GEMA ne traite
  391. pas que des nombres, il peut aussi evaluer des symboles.
  392.  
  393.     Symboles :
  394.  
  395.     Il en existe 3 types sous GEMA :
  396.  
  397.     - Les labels.
  398.  
  399.     Le format d'une ligne d'instruction sous GEMA est :
  400.  
  401. [Label]    [Instruction]    [Arguments]    [Commentaire]
  402.  
  403.     Si on declare un label, il faut le faire imperativement en debut de ligne. Les
  404. deux points qui suivent sont facultatifs.
  405.     Une instruction ne doit jamais se trouver en debut de ligne, mais au moins
  406. apres des espaces et/ou tabulations. Une instruction qui se trouve en debut de ligne
  407. sera interpretee comme un LABEL (Oui on peut utiliser des mots reserves comme labels ou
  408. variables, pas de probleme).
  409.         Le commentaire n'a pas toujours besoin d'etre precede d'un point virgule, mais une
  410. ligne de commentaires sans instruction doit commencer (donc a la place du label) par un
  411. asterisque, un point virgule, un pourcent ou un slash.
  412.  
  413. {    Exemples :
  414.  
  415.     Toto    move.l a,b        ceci est un commentaire
  416.         addx (si,bx),c
  417.     Tut
  418.         bra.s Tut        youpla
  419.  
  420.     * Ligne de commentaire
  421.     / Autre ligne de commentaire
  422.  
  423.     Pouet:    nop }
  424.  
  425.  
  426.         Parfois, un point virgule est neanmoins necessaire pour un commentaire
  427. place a la fin d'une ligne d'instruction.
  428.  
  429.         Ainsi :
  430.  
  431.                 rts tititata
  432.  
  433.         cherchera a evaluer tititata, vu que l'instruction rts peut etre utilisee
  434. aussi bien seule qu'avec un argument.
  435.  
  436.         Contrairement a :
  437.  
  438.                 rts ; tititata
  439.  
  440.         Ou tititata sera ignore comme tout bon commentaire digne de ce nom.
  441.  
  442.         On peut mettre des espaces un peu partout, GEMA va les ignorer,
  443.  
  444. {     Exemple :
  445.  
  446.     addx.l 4 + 3 / [ 1 + 2 ] (   sie   ,   be  *  8   )  ,  d }
  447.  
  448.     Par contre on ne met jamais d'espace entre une instruction et un eventuel
  449. indicateur de taille (addx.l et pas addx .  l) .
  450.  
  451.         Le label START est toujours defini comme label nul, il represente le debut du
  452. programme et peut etre utilise par les maniaques au meme titre que NULL en C ...
  453.  
  454.     Un label peut etre utilise au sein d'une expression arithmetique. Il a dans ce
  455. cas pour valeur son offset par rapport au debut du programme, moins la valeur d'ASSUME
  456. (On verra ASSUME plus tard) + la valeur du dernier ORG (Ca aussi on verra plus tard) .
  457.  
  458. {    Exemple :
  459.  
  460.     Toto    move.l #Toto-Tata/2,Toto+2
  461.     Tata    flush }
  462.  
  463.     Un tel label ne peut etre defini qu'une fois dans le source faute de quoi GEMA
  464. vous signalera l'erreur. Il a une valeur constante pendant tout l'assemblage, contrai-
  465. rement aux labels locaux et aux variables.
  466.  
  467.     - Les labels locaux :
  468.  
  469.     C'est pareil que les labels globaux sauf qu'on peut les redefinir. Leur nom doit
  470. commencer par un point. C'est assez utile pour les boucles,
  471.  
  472. {     Exemple :
  473.  
  474.         move #$1234,c
  475.     .wait    dec c
  476.         bne .wait            identique a jnz
  477.  
  478.         ...plein d'instructions...
  479.  
  480.         move a,c
  481.     .wait    nop
  482.         cmps.b
  483.         dbeq .wait            identique a loopnz }
  484.  
  485.     Ils peuvent etre employes au sein d'expressions arithmetiques et ont pour valeur
  486. la derniere fois ou ils ont ete definis avant le calcul.
  487.     On peut aussi leur assigner une valeur constante grace a la directive SET :
  488.  
  489. {    Exemple :
  490.  
  491.     .wait    set    $1234  }
  492.  
  493.     Et zou, le label local .wait vaut $1234. Par contre avant d'etre affecte par la
  494. constante, il vaut la valeur de l'offset de l'instruction comme tout bon label. Et alors
  495. me direz-vous ? Bin si vous faites par exemple:
  496.  
  497. {    .wait    set    .wait+2 }
  498.  
  499.     Vous pouvez faire ca plusieurs fois de suite, .wait va toujours valoir deux
  500. octets de plus que sa derniere declaration. C'est hyper utile pour le code automodifie.
  501.     Imaginons maintenant une autre situation, ou vous devez faire une table des
  502. multiples de 3. On verra plus bas que les instructions REPT...ENDR permettent de
  503. repeter un bout de code et que DC.L permet d'inserer dans l'objet un mot long constant
  504. (comme DD sous TASM). Ce qui serait interessant c'est que .wait vale eventuellement la
  505. valeur de l'endroit ou il se trouve lors de sa premiere declaration, et qu'il ne soit
  506. plus affecte que par la valeur du set par la suite.
  507.     GEMA le permet et ce sont les variables d'assemblage.
  508.  
  509.     - Les variables d'assemblage
  510.  
  511.     Leur nom commence par un point d'exclamation. Elles peuvent etre utilisees
  512. comme les labels. Ce sont des labels locaux qui ne sont affectes par l'offset ou ils se
  513. trouvent qu'au premier assignement. Ainsi pour faire notre table de 3 sur 256 mots
  514. longs.
  515.  
  516. {    Exemple:
  517.  
  518.     !Toto    set 0
  519.         rept 256
  520.         dc.l !Toto
  521.     !Toto      set !Toto + 3
  522.         endr }
  523.  
  524.     Merveilleux non ? Dans une meme expression on peut bien entendu melanger les
  525. trois types de symboles et peut forcer leur type.
  526.  
  527.     Les mots reserves sont utilisables et tous les caracteres sont significatifs.
  528.     Majuscules et minuscules sont differenciees. Les caracteres admis sont les
  529. lettres, les chiffres, l'underscore (_), le point d'exclamation et le point.
  530.  
  531.  
  532. II.3. Directives d'assemblage
  533.  
  534.     Elles se placent en seconde position comme toute instruction.
  535.  
  536.     - REPT <constante>...ENDR
  537.  
  538.     Permet de repeter plusieurs fois un bout de code.
  539.  
  540. {    Exemple:
  541.  
  542.         rept 5
  543.           nop
  544.           xlat
  545.         endr  }
  546.  
  547.     Et zou on aura : nop xlat nop xlat nop xlat nop xlat nop xlat
  548.  
  549.     - SET
  550.  
  551.     Deja vu.
  552.  
  553.     - ORG <constante>
  554.  
  555.     Permet de fixer un offset de base. Bah c'est comme sous TASM ou n'importe quel
  556. assembleur, sauf que sous GEMA vous pouvez en mettre ou vous voulez meme si ca n'a
  557. d'interet qu'au debut d'un programme.
  558.  
  559. {    Exemple :
  560.  
  561.      org $100  (GEMA accepte aussi org #$100) }
  562.  
  563.  
  564.     - TITLE titre
  565.  
  566.     Donne un titre au fichier source en cours. Actuellement inutilise.
  567.  
  568.     - USE16
  569.  
  570.     Indique que le code qui suit sera dans un code en 16 bits par defaut
  571. ( necessite d'employer des prefixes pour les acces 32 bits ) - Par defaut.
  572.  
  573.     - USE32
  574.  
  575.     Le code qui suit est suppose se trouver dans un segment de code en
  576. 32 bits. Ceci n'est possible qu'en mode protege.
  577.  
  578.     - OPT
  579.  
  580.     Active ou desactive certaines options. Prioritaire par rapport aux
  581. options entrees en ligne de commande.
  582.  
  583.         OPT o+ : active les optimizations automatiques
  584.         OPT o- : les desactive
  585.         OPT w+ : active tous les warnings
  586.         OPT w- : desactive tous les warnings
  587.         OPT v+ : mode verbose
  588.         OPT v- : mode abbrege
  589.         OPT q+ : mode silencieux
  590.         OPT q- : mode normal
  591.         OPT a+ : alignement automatique
  592.         OPT a- : alignement normal ( defaut )
  593.  
  594.     - INCLUDE <fichier>
  595.  
  596.     Insere le fichier a cet endroit du source et continue la procedure
  597. d'assemblage ( comme #include en C ) . Un source peut en include d'autres qui peuvent
  598. eux-memes en inclure d'autres qui peuvent... Il n'y a pas de limite de profondeur,
  599. mais un controle elementaire de references circulaires est realise. Le nom du fichier
  600. peut etre encadre de ' ou de " ( ou de rien du tout ) .
  601.  
  602.         - ONCE
  603.  
  604.         Comme #pragma once qui est implemente sur la plupart des compilateurs C.
  605. Inclue le fichier uniquement si il ne l'a pas deja ete auparavant.
  606.  
  607.         - INCBIN <fichier>
  608.  
  609.     Voici LA commande qui manque cruellement sur TASM et MASM... Elle permet
  610. d'inclure un fichier binaire au milieu d'un code ... Plus besoin de galerer a faire des
  611. conversions hexa. Pour inserer la photo de votre copine a poil au label 'tut' il suffit
  612. desormais de faire :
  613.  
  614. {    Exemple :
  615.  
  616.         tut    incbin cindy.jpg }
  617.  
  618.     ou
  619.  
  620. {    Exemple :
  621.  
  622.         tut    incbin "cindy.jpg"    c'est pareil... }
  623.  
  624.     - DC
  625.  
  626.     Inclue un octet, un mot, un mot long ou une chaine.
  627.  
  628. {    Exemple :
  629.  
  630.         dc.b 1,2,3,4,"Tototata",'t',10
  631.         dc.w $1234,"tuttut",4 }
  632.  
  633.         Dans ce cas, la chaine est inseree en tant qu'octets comme si on avait
  634. fait :
  635.  
  636. {    Exemple :
  637.         dc.w $1234
  638.         dc.b "tuttut"
  639.         dc.w 4    }
  640.  
  641.     - DS
  642.  
  643.     Inclue un certain nombre d'octets nuls.
  644.  
  645. {     Exemple :
  646.  
  647.     ds.b 4    equivaut a dc.b 0,0,0,0
  648.     ds.l 3    equivaut a dc.l 0,0,0 }
  649.  
  650.         - EVEN, ALIGN, SEGMENT, PAGE, DPAGE, PPAGE
  651.  
  652.     Insere des nops de facon a ce que ce qui suive soit aligne:
  653.  
  654.     EVEN = 2 octets
  655.     ALIGN.B / .W / .L /.Q = Devinez (.Q = Quad)
  656.     SEGMENT = 16 octets
  657.     PAGE = 256 octets
  658.         DPAGE = 512 octets
  659.         PPAGE = 2048 octets
  660.  
  661.         - MIN ou MINI xxx
  662.  
  663.         Taille minimale de RAM necessaire au programme. Exprime en blocs de 16 octets.
  664.  
  665.         - LIMIT xxx ou MAX xxx
  666.  
  667.     Limite la taille maximale d'un .EXE a <xxx> octets. Utile pour les programmes
  668. residents et les overlays. Exprime en blocs de 16 octets.
  669.  
  670.         - OVERLAY xxx
  671.  
  672.         Fixe l'overlay.
  673.  
  674.     - STACK
  675.  
  676.     Indique ou est placee la pile (SS:SP) au debut de l'execution d'un .EXE, ex:
  677.  
  678. {    Exemple:
  679.     header
  680.     * plein d'instructions
  681.     prout    stack
  682.     * plein d'instructions }
  683.  
  684.     - HEADER
  685.  
  686.     Insere le header d'un fichier .EXE avec la table de relocation et tout le bordel.
  687. Generalement c'est toujours la premiere instruction d'un programme ... Mais bon on peut
  688. en mettre n'importe ou, on peut meme en mettre plusieurs (ca peut etre pratique pour des
  689. petits .EXE qui sont inclus dans un autre) ... IMPORTANT: La taille de ces header
  690. n'influe pas sur la taille logique d'un fichier. C'est logique mais bon pour les barges
  691. qui s'amusent a en mettre plusieurs et n'importe ou dans le source, ca peut etre utile.
  692.  
  693.     - ASSUME <Constante>
  694.  
  695.     Permet de fixer la reference par rapport a laquelle sera calculee l'offset de
  696. tous les labels. TASM permet d'"assumer" une valeur differente par rapport a chaque
  697. descripteur de segment. Mouuuaaiiiiss... J'en vois pas trop l'utilite vu qu'on peut faire
  698. ce qu'on veut de nos pointeurs de segment a forciori mais je rajouterai peut-etre cette
  699. possbilite dans la prochaine version.
  700.  
  701.     - FATAL
  702.  
  703.         Arrete l'assemblage et vous ejecte. Ca ne sert absolument a rien (mais c'est
  704. rigolo...)
  705.  
  706.     - SECTION BSS ou simplement BSS
  707.  
  708.     Ce qui suit sera interprete pour calculer les offsets des labels contenus,
  709. mais pas integre dans le programme executable.
  710.  
  711.     - SECTION TEXT, SECTION DATA, TEXT ou DATA
  712.  
  713.     Annule l'effet des directives precedentes.
  714.  
  715.         - REAL ou REALMODE
  716.  
  717.         Indique que la taille de tous les segments qui vont suivre ( a partir de
  718. l'endroit ou se trouve cette directive ainsi qu'apres chaque SEGMENT, PAGE, DPAGE
  719. ou PPAGE ) est de 64Ko, comme c'est le cas par defaut en mode reel. Ces directives
  720. ne servent qu'a produire une erreur dans le cas ou l'on depasserait cette limite.
  721. Elles n'ont pas d'influence sur le code genere.
  722.  
  723.         - UNREAL ou UNLIMIT ou FLAT
  724.  
  725.         Contrairement aux directives precedentes, ce jeu de directives indique que
  726. le code qui suit est dans un segment de taille supposee infinie. Sous GEMA, tous les
  727. segments sont supposes avoir une taille infinie par defaut.
  728.  
  729.         - SEGSIZE <taille>
  730.  
  731.         Les segments qui suivent auront pour taille maximale <taille>.
  732.  
  733.  
  734.         Ces trois ensembles de directives peuvent etre prefixees d'une directive
  735. d'alignement ( SEGMENT, PAGE, DPAGE, PPAGE ) ou servir elles-memes de prefixes a une
  736. instruction quelconque.
  737.  
  738.         Exemple :
  739.  
  740.                 SEGMENT:REAL
  741.  
  742.         est equivalent a :
  743.  
  744.                         SEGMENT
  745.                         REAL
  746.  
  747.  
  748.  
  749.                 SEGSIZE 4096:PAGE
  750.  
  751.         est equivalent a :
  752.  
  753.                         SEGSIZE 4096
  754.                         PAGE
  755.  
  756.  
  757.         Dans ces deux cas, l'ordre n'a absolument aucune importance. Ainsi
  758. DPAGE:UNREAL aura le meme effet que UNREAL:DPAGE .
  759.  
  760.         Ces directives ne sont generalement utiles qu'en mode reel ou protege avec
  761. des segments de tailles folkloriques. Dans tous les autres cas, elles sont inutiles,
  762. GEMA ne travaillant normalement qu'avec des segments infinis.
  763.  
  764.  
  765. III. Mnemoniques
  766. ________________
  767.  
  768.  
  769.     Toutes (a part deux) les mnemoniques de TASM peuvent etre utilisees telles
  770. quelles sous GEMA, y compris tous les synonymes (JZ et JE par exemple). Les instructions
  771. qui different sous TASM et MASM (exemple XLAT et XLATB) sont accessibles sous les deux
  772. formes par GEMA et ont bien entendu le meme effet.
  773.     Mais il y a de nouveaux synonymes, qui sont pour la plupart les equivalents
  774. 680x0. Il y a aussi des formes plus logiques.
  775.     La liste qui suit represente quelques instructions synonymes et celles qui
  776. necessitent un commentaire :
  777.  
  778.     LEAVE = UNLINK
  779.     MOV = MOVE
  780.     MOVSX = MOVESX
  781.     MOVZX = MOVEZX
  782.     TRAPV = INTO
  783.     WBINVD = FLUSH
  784.     TRAP = INT
  785.  
  786. Tolere des absolus. Par exemple TRAP #14 est identique a TRAP 14 ou INT 14.
  787.  
  788.         RTED = RTID = IRETD
  789.         RTE = RTI = IRET
  790.     BRAF ~ JMPF
  791.  
  792. JMPF est la version FAR de JMP. Il prend deux arguments qui sont respectivement le
  793. segment et l'offset, exemple JMPF $14c9,$418db2a.
  794. Mais comme on utilise bien souvent un Far Jump avec l'adresse d'un label ou une adresse
  795. absolue et qu'il est alors lourd de faire JMPF \label,:label , il vaut mieux utiliser
  796. BRAF qui est exactement comme JMPF en dehors du fait qu'elle ne prend qu'un seul
  797. argument qui est une adresse 32-bits qu'elle se debrouille pour convertir en segment et
  798. offset. Par exemple BRAF $12345 equivaut a JMPF $1234,5
  799.  
  800. Ces instructions peuvent etre utilisees en word ou en long (sur 386+ uniquement).
  801.  
  802.     BRA ~ JMP
  803.  
  804. BRA est exactement comme JMP sauf qu'en toute logique, JMP label sous GEMA equivaut a un
  805. JMP [label] sous TASM, ce qui signifie un saut a l'adresse contenue dans label et non pas
  806. un saut a label.Toujours en toute logique, il conviendrait de faire JMP #label. Et c'est
  807. effectivement ce qu'il faut faire avec JMP. Mais etant donne qu'on fait beaucoup
  808. plus souvent des JMP #label que des JMP label, mieux vaut utiliser BRA qui est identique
  809. sauf dans ce mode d'adressage. BRA label equivaut a BRA #label ou JMP #label. En dehors
  810. de ce mode d'adressage, BRA peut prendre tous les arguments qu'encaisse un JMP, par
  811. exemple BRA (si,dx) . Un BRA ou un JMP peut etre suivi de .s ou .b s'il est court, ou de
  812. .l s'il doit s'effectuer en 32-bits (en mode protege uniquement sinon vous allez avoir
  813. des surprises a moins de defragmenter la Ram avant et de proteger un segment, par exemple
  814. via l'interface DPMI de QEMM... Mais c'est une autre histoire...) .
  815.     REP = REPE = REPZ
  816. Les prefixes du type REP et les prefixes de segment CS DS etc... peuvent etre utilises
  817. de deux manieres :
  818.  
  819. Soit independemment sur une ligne, ils sont alors consideres comme des instructions a
  820. part entiere.
  821.  
  822. Soit en tant que prefixes qui doivent alors comme tout bon prefixe PRECEDER
  823. l'instruction. Ils doivent alors etre suivis de deux points (dans le cas precedent, pas
  824. de deux points, ca m'enerve de mettre des deux points alors qu'il n'y a rien derriere)
  825.  
  826. {    Exemple :
  827.  
  828.     toto    ds
  829.         gs:move.l (si),a
  830.         rep  : outs.b
  831.         repne
  832.         ins.l }
  833.  
  834. Comme on peut le voir, on peut mettre des espaces a cote des deux points, comme
  835. d'habitude ca pose aucun probleme.
  836.  
  837.     HLT = STOP
  838.     XOR = EOR
  839.     CMC = NGC
  840.     CLD = D+    ('+' comme : incremente)
  841.         STD = D-        ('-' comme : decremente)
  842.     CLI = INTOFF
  843.     STI = INTON    (Les coders en Saturn apprecieront)
  844.     ADDX = ADC
  845.     BS+ = BSF    (pareil, c'est plus clair de mettre + que (F)orward)
  846.     BS- != BSR
  847.  
  848. ATTENTION, BSR N'A PAS LE MEME SENS SOUS GEMA QUE SOUS TASM ET MASM
  849.  
  850. En effet il est utilise pour appeller des sous-programmes comme nous le verrons plus bas
  851. par consequent pour scanner les bits a l'envers, il faut faire BS- imperativement.
  852.  
  853.     BTSTC = BTSTN = BTC
  854.     BTSTR = BTR
  855.     TAS = BTS = BTSTS
  856.     BTST = BT
  857.     (BSRF = JSRF) ~ CALLF
  858.  
  859. C'est la version Far de Call. Le principe est le meme que pour JMPF et BRAF sauf que
  860. les instructions qui ne prennent qu'un argument sont BSRF et JSRF, l'instruction CALL
  861. FAR telle que nous la connaissions reste logiquement CALLF.
  862. C'est parfaitement ridicule de declarer les sous-programmes avec PROC NEAR ou FAR machin
  863. en assembleur. L'assembleur est fait pour ceux qui codent comme des porcs pour faire
  864. cracher les tripes de leur becanes et pas par des abrutis revant au PASCAL et au
  865. COBOL ou autres LOGO. Par consequent sous GEMA vous faites BSRF ou BSR suivant le type
  866. d'appel que vous voulez, au moins vous savez comment ca va etre assemble.
  867.  
  868.     (BSR = JSR) ~ CALL
  869.  
  870. Version near de CALL. Memes remarques que pour les BRA et JMP.
  871.  
  872.      RTS = RTN
  873.     RTSF = RTNF
  874.  
  875. Retour d'un sous programme near ou far. Peuvent etre suivis d'un immediat.
  876.  
  877.     EXTA.Q = EXT.Q = CDQ
  878.     EXTA = EXT ou EXT.W = CBW
  879.     CWD = EXT.L = EXTA.L
  880.     DIVS = IDIV
  881.     DIVU = DIV
  882.     LINK = ENTER
  883.     WAIT = FWAIT (Microsoft/Borland)
  884.     MULS = IMUL
  885.     MULU = MUL
  886.     INS, OUTS, MOVES, LODS et compagnie :
  887.  
  888. Les instructions sur les strings doivent suivre la logique de GEMA, a savoir
  889. l'instruction suivie eventuellement de la taille, avec .W par defaut.
  890. Ainsi au lieu de OUTSD sous TASM, il suffit de faire OUTS.L.
  891.  
  892.     BHI = JNBE
  893.     BCC = JAE = JNB = JNC
  894.     BCS = JNAE
  895.     BLS = JBE = JNA
  896.     BGE = JGE = JNL
  897.     BVC = JNO
  898.     BLT = JNGE
  899.     BLE = JLE = JNG
  900.     BCXZ = JCXZ
  901.     BEQ = JE = JZ
  902.     BGT = JNLE
  903.     BECXZ = JECXZ = JCEZ = BCEZ
  904.     BPL = JNS
  905.     BNE = JNE = JNZ
  906.     BPO = JPO = JNP
  907.     BVS = JO
  908.     BPE = JPE = JP
  909.     BMI = JS
  910.  
  911. J'en ai peut-etre oublie, mais sont equivalentes :
  912.  
  913. Toutes les equivalences reconnues par MASM et TASM
  914. Leurs equivalents Motorola.
  915.     SETxx = Sxx
  916. C'est comme au dessus ... Par exemple SZ c'est identique a SEQ ... Tous les synonymes
  917. Microsoft, Borland et Motorola sont reconnus.
  918.  
  919.     LOOPE = LOOPZ = DBEQ
  920.     LOOPNE = LOOPNZ = DBNE
  921.     LOOP = DBF = DBRA
  922.     ROXL = RCL
  923.     ROXR = RCR
  924.     SAHF = SAF
  925.     ASL = SAL = SHL
  926.     ASR = SAR ( != SHR )
  927.     SUBX = SBB
  928.     XLAT = XLATB
  929.  
  930.     Evidemment quelque soit les synonymes choisis, les modes d'adressage gardent
  931. toujours la norme GEMA :
  932.     Dans les cas ou un immediat est systematiquement attendu, on peut se
  933. permette de ne pas mettre de #,
  934.     Lorsque la taille des registres depend de l'instruction (95% des cas) on peut
  935. utiliser des registres indetermines,
  936.     Lorsqu'un argument source et un argument cible sont en jeu, ils doivent toujours
  937. etre dans cet ordre respectif.
  938.     Les instructions qui possedent une variante 32-bits doivent etre activees par .L
  939. ou le sont automatiquement lorsqu'il s'agit d'immediats ou d'offsets constants 32-bits.
  940.  
  941.     Quoi qu'il en soit, lorsqu'il n'y a pas d'ambiguite possible, GEMA reconnait un
  942. certain nombre d'abus (comme le INT 14 qui devrait normalement n'accepter que INT #14),
  943. et dans tous les cas les solutions les plus logiques sont rentenues. En cas de probleme
  944. il y a tout plein de messages d'erreurs et de warnings assez precis.
  945.  
  946.         AAM et AAD
  947.  
  948.         Ces instructions peuvent etre suivies d'un nombre immediat (avec ou sans le #)
  949. et permettent une decomposition selon n'importe quel diviseur (et non pas seulement 10).
  950. Cela marche sur tous les processeurs actuels, mais n'est pas documente.
  951.  
  952.         SALC
  953.         ICEBP = ICE01 = TRAP01
  954.         UMOV = UMOVE
  955.         LOADALL
  956.  
  957.         Instructions non documentees des 386+. Voir www.x86.org pour plus d'informations.
  958. Tous ces opcodes sont implementes dans GEMA, mais un warning a lieu lorsque l'option
  959. verbose (-v ou --verbose) est activee.
  960.  
  961.         CMOV = CMOVE
  962.         RDPMC
  963.         UD
  964.         UD2
  965.  
  966.         Nouvelles instructions du P6, implementees dans GEMA. UD et UD2 semblant
  967. fonctionner sur tous les processeurs, ils ne generent jamais de warning.
  968.  
  969.  
  970.  
  971.  
  972.         Voici un exemple de programme tres complexe et original puisqu'il affiche la
  973. phrase "Hello world !" ...
  974.  
  975. {       org $100
  976.  
  977.     push cs
  978.         pop ds                          ds = cs
  979.         move #plouf,d                   offset de plouf dans dx
  980.         move.b #9,ah                    9 dans ah
  981.         trap #$21                       appel de l'exception $21
  982.         move #$4c00,a                   exit(0)
  983.         trap #$21                       et hop
  984. plouf   dc.b "Hello world !",13,10,'$'  le texte a afficher     }
  985.  
  986.         Oh miracle quand on assemble ce petit bout de code on obtient un fichier COM
  987. qui affiche avec la fonte immonde du DOS un truc dans une langue etrangere...
  988.  
  989.         Voici une autre version beaucoup plus longue et sans interet. Mais elle
  990. contient la structure d'un programme executable complexe. La moitie des instructions
  991. est inutile pour afficher un texte, mais si vous attaquez des choses un peu plus
  992. serieuses elles vous semblera beaucoup plus interessante.
  993.  
  994. {       header                          cree un fichier .EXE et non un .COM
  995.         overlay $1234                   numero d'overlay (inutile)
  996.         min 1+@fin                      memoire minimum necessaire (inutile)
  997.         max 1+@fin                      ici pareil que la memoire maximum
  998.  
  999.         move cs,a                       adresse de segment code
  1000.         move a,ds                       ...dans ds
  1001.         move.b #9,ah                    fonction 9
  1002.         move #plouf,d                   offset du label plouf dans DX
  1003.         trap #$21                       appel de l'exception
  1004.         move #$4c00,a                   code de fin de programme DOS
  1005.         trap #$21                       qu'on appelle
  1006. plouf   dc.b "Hello world !",13,10,'$'  texte a afficher
  1007.  
  1008.         segment                         alignement a un multiple de 16
  1009.         ds.l 128                        128 mots longs d'espace pour la pile
  1010. fin     stack                           defini la nouvelle pile }
  1011.  
  1012.         Si malgre tout certaines choses vous semblent encore obscures n'hesitez pas a me
  1013. contacter, la solution la plus rapide etant par E-Mail a l'adresse : j@nether.net
  1014.  
  1015. IV. That's all folks
  1016.  
  1017.     J'espere que vous arriverez a utiliser ce fabuleux (n'ayons pas peur des mots)
  1018. outil et que vous en verrez l'interet par rapport a TASM et MASM... Toutes vos
  1019. suggestions, critiques, remarques et bug-reports seront les bienvenus...
  1020.  
  1021.  
  1022. (Note du correcteur: Demandez lui encore et encore de completer sa doc au maximum, en
  1023. lui foutant un paquet d'exemples etc etc ... -flemmard comme il est il ne le fera
  1024. surement pas sinon- a vous de jouer !
  1025.                             Mogar Slayer Of Potatoes)
  1026.  
  1027.  
  1028.  
  1029.  
  1030.  
  1031.  
  1032.  
  1033.  
  1034.